import copy

# 对于一些可变对象如列表、字典、集合若要复制它们的内容到另一地址可通过其方法y=x.copy()
my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
a = my_dict.copy()  # 对于可变对象要区别于直接赋值a=my_dict此时a和my_dict地址相同，若改变a则my_dict也会改变。
print(a)
print(a is my_dict)


# 但对于一些没有此方法的可变对象（如自定义对象）则需使用copy模块中的函数copy()
def use_copy():
    my_list = [1, 2, 3, 4, 5]
    a = copy.copy(my_list)
    print(a is my_list)


use_copy()

# copy.copy()是浅copy，即对一个对象的顶层拷贝（只做最外层的复制）内层若还有可变对象则不变其地址
x = [1, 2, 3]
y = [4, 5, 6]
my_list = [x, y]
a = copy.copy(my_list)
print(a is my_list)  # a的地址和my_list的地址不同
print(a[0] is my_list[0])  # 但a[0]和my_list[0]的地址相同（即没有复制内层的可变对象x的内容到另一地址，而是直接引用了同一个x）
a[0][1] = 99
print(my_list)  # 因此当变动了a[0]（x）中的内容时，my_list[0]（x）中的内容也会改变
print(a[1] is my_list[1])


# cope.deepcopy()是深copy，就可以解决这个问题，实现对一个对象所有层次的拷贝
def use_deepcopy():
    class Hero:
        def __init__(self, name):
            self.name = name
            self.equipment = ["帽子", "鞋子", "怀表"]

    old_hero = Hero("蚂蚁")
    new_hero = copy.deepcopy(old_hero)  # 深copy
    new_hero.equipment.append("翅膀")  # 新对象修改后，原对象不会受到任何影响
    print(old_hero.equipment)


use_deepcopy()
